#include "cpu/exec/template-start.h"

#define instr shrd

#if DATA_BYTE == 2 || DATA_BYTE == 4
//并行右移
static void do_execute () {
	DATA_TYPE in = op_dest->val;	//被移位的值
	DATA_TYPE out = op_src2->val;	//移位操作数
	//获取移位计数，确保在0-31之间
	uint8_t count = op_src->val;
	count &= 0x1f;		//只保留低5位
	//并行进行右移操作
	while(count != 0) {
		out >>= 1;		//右移操作数
		out |= (in & 1) << ((DATA_BYTE << 3) - 1);		//被移位的最低位放到输出的最高位
		in >>= 1;		//减少被移位的值
		count --;		//减少移位计数
	}
	//将结果写入第二源操作数
	OPERAND_W(op_src2, out);

	print_asm("shrd" str(SUFFIX) " %s,%s,%s", op_src->str, op_dest->str, op_src2->str);
}

make_helper(concat(shrdi_, SUFFIX)) {
	//使用decode_si_rm2r解码1字节立即数
	int len = concat(decode_si_rm2r_, SUFFIX) (eip + 1);  /* use decode_si_rm2r to read 1 byte immediate */
	op_dest->val = REG(op_dest->reg);
	do_execute();
	return len + 1;
}
#endif

#include "cpu/exec/template-end.h"
